home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Complete Linux
/
Complete Linux.iso
/
docs
/
system
/
filesyst
/
dosfs
/
dosfsck_.z
/
dosfsck_
/
dosfsck
/
boot.c
next >
Wrap
C/C++ Source or Header
|
1993-05-07
|
3KB
|
76 lines
/* boot.c - Read and analyze ia PC/MS-DOS boot sector */
/* Written 1993 by Werner Almesberger */
#include <stdio.h>
#include <linux/msdos_fs.h>
#include "common.h"
#include "dosfsck.h"
#include "io.h"
#include "boot.h"
#define ROUND_TO_MULTIPLE(n,m) ((n) && (m) ? (n)+(m)-1-((n)-1)%(m) : 0)
/* don't divide by zero */
static void dump_boot(DOS_FS *fs,struct msdos_boot_sector *b)
{
printf("Boot sector contents:\n");
printf("%10d bytes per logical sector\n",CF_LE_W(*(unsigned short *)
&b->sector_size));
printf("%10d bytes per cluster\n",fs->cluster_size);
printf("%10d reserved sectors\n",CF_LE_W(b->reserved));
printf("First FAT starts at byte %u\n",fs->fat_start);
printf("%10d FATs\n",b->fats);
printf("%10d bytes per FAT\n",fs->fat_size);
printf("Root directory starts at byte %u\n",fs->root_start);
printf("%10d root directory entries\n",fs->root_entries);
printf("Data area starts at byte %u\n",fs->data_start);
printf("%10u data clusters (%u bytes)\n",fs->clusters,fs->clusters*
fs->cluster_size);
}
void read_boot(DOS_FS *fs)
{
struct msdos_boot_sector b;
int logical_sector_size,fat_entries,data_size;
fs_read(0,sizeof(b),&b);
logical_sector_size = CF_LE_W(*(unsigned short *) &b.sector_size);
fs->cluster_size = b.cluster_size*logical_sector_size;
if (b.fats != 2)
die("Currently, only 2 FATs are supported, not %d.\n",b.fats);
fs->fat_start = CF_LE_W(b.reserved)*logical_sector_size;
fs->fat_size = CF_LE_W(b.fat_length)*logical_sector_size;
fs->root_start = (CF_LE_W(b.reserved)+b.fats*CF_LE_W(b.fat_length))*
logical_sector_size;
fs->root_entries = CF_LE_W(*((unsigned short *) &b.dir_entries));
fs->data_start = fs->root_start+ROUND_TO_MULTIPLE(fs->root_entries <<
MSDOS_DIR_BITS,logical_sector_size);
data_size = (CF_LE_W(*((unsigned short *) &b.sectors)) ? CF_LE_W(
*((unsigned short *) &b.sectors)) : CF_LE_L(b.total_sect))*
logical_sector_size-fs->data_start;
if (!fs->cluster_size) die("Cluster size is zero.");
if (!logical_sector_size) die("Logical sector size is zero.");
fs->clusters = data_size/fs->cluster_size;
fat_entries = (fs->clusters > MSDOS_FAT12 ? fs->fat_size/2 :
fs->fat_size*2/3)-2;
if (fs->clusters > fat_entries)
die("File system has %d clusters but only space for %d FAT entries.",
fs->clusters,fat_entries);
if (!fs->root_entries) die("Root directory has zero size.");
if (fs->root_entries & (MSDOS_DPS-1))
die("Root directory (%d entries) doesn't span an integral number of "
"sectors.",fs->root_entries);
if (logical_sector_size & (SECTOR_SIZE-1))
die("Logical sector size (%d bytes) is not a multiple of the physical "
"sector size.",logical_sector_size);
if (!b.secs_track || !b.heads)
die("Invalid disk format in boot sector.");
if (verbose) dump_boot(fs,&b);
}